<?php

class TabelaModelHomeYeti extends ModelYeti /*implements ModelInterfaceActiverecordLibYeti*/ {    
    
    function hasAttachedFile() {
        // idx_file é o nome do campo :> $_FILES['idx_file']
        return Array(
            'idx_file' => Array(
                'style' => Array(
                    'small'  => '120x120',
                    'media'  => '150x150',
                    'big'    => '150x150',
                    'bigest' => '200x200',
                ),
                'validate' => Array(
                    'less' => '2MB', 
                    'more' => '4MB',
                    'mime' => Array('image/jpeg', 'image/pjpeg', 'image/jpg', 'image/gif', 'image/png'),
                    'mime_message_alias' => 'msg_mime_validate', // procurará no g11n por model/upload/validate/msg_mime_validate
                ),
                // :style > 120x120 | :basename > nome_do_arquivo.jpg | :stylename > small | :filename > nome_do_arquivo | :extension > jpg
                'path' => '/blabla/path_here/:style/:basename',
                //'name' => date('Ymd') . '_:filename',
                'name' => 'nome2_arquivo', // sobrescreverá o nome
                'overwrite' => FALSE, // sobrescreverá o arquivo? Caso FALSE, ficará file_2.jpg, file_3.jpg...
            )
        );
    }
    
    function hasOne() {
        return Array('Tabela_para_um' => Array(
            'through' => 'classe_diferente_aqui'
        ));
    }
    
    function hasMany() {
        return Array('Tabela_para_muitos');
    }
    
    function belongsTo() {
        return Array('Recebe_de_tabela');
    }
    
    function defineFields() {
        return Array(
            'Id'    => Array('type' => 'integer', 'primary_key' => TRUE, 'alias' => 'ID_NOME_DA_COLUNA_NO_BANCO'),
            'Admin' => Array('type' => 'boolean', 'readonly'    => TRUE),
            'Nome'  => Array('type' => 'string',  'length'      => 30),
            'Email' => Array('type' => 'string',  'default'     => 'blabla'),
            'ConfirmEmail' => Array('type' => 'string'),
            'Cpf'    => Array('type' => 'integer', 'invisible' => TRUE),
            'Estado' => Array('type' => 'string'),
            'Number' => Array('type' => 'integer'),
            'Cep'    => Array('type' => 'integer')
        );
    }
    
    function beforeValidation() {
        return Array('lista', 'de calbbacks', 'para validação', 'aqui');
    }
    
    function beforeValidationOnCreate() {}
    function afterValidation() {}
    function afterValidationOnCreate() {}
    function beforeFind() {}
    function beforeSave() {}
    function beforeCreate() {}
    function beforeUpdate() {}
    function beforeDestroy() {}
    function caseInsert() {}
    function caseUpdate() {}
    function caseDelete() {}
    function afterCreate() {}
    function afterUpdate() {}
    function afterDelete() {}
    function afterSave() {}
    function afterFind() {}
    
    
    // Posso pré-determinar condições para as consultas
    function defaultScope() {
        // WHERE Email IN ('abc', 'def', 'ghi') AND Nome LIKE '%Test%' ORDER BY Email ASC, Nome DESC
        return $this->filter('Email', Array('abc', 'def', 'ghi'))->filter_likelr('Nome', 'Test')->order(Array('Email' => 'ASC', 'Nome' => 'DESC'));
        
        /*
        *******
        * filter_xx : caso o valor seja NULO ou esteja em branco, será enviado como 'NULL' ou ''
        * WHERE Email = 'abc123' AND Nome IS NULL
        * $this->filter('Email', 'abc123')->filter('Nome', NULL);
        **
        * filterFlout_xx : caso o valor seja NULO ou esteja em branco, é desconsiderado
        * WHERE Email = 'abc123'
        * $this->filter('Email', 'abc123')->filterFlout('Nome', NULL);        
        *******
        * WHERE Email NOT IN ('abc', 2, '14') OR Nome LIKE '%test' AND IFNULL(NULL, true) LIMIT 2 OFFSET 17
        * return $this->filter_not('Email', Array('abc', 2, '14'))->operator('OR')->filter_likel('Nome', 'test')
            ->filter_function('IFNULL', Array(null, true))->find(2, 17);
        **
        * WHERE Id = 12 AND (Email != 'def' OR Deletado = 'S') ORDER BY Deletado ASC, Email ASC
        * return $this->filter('Id', '12')->openClausule()->filter_not('Email', 'def')->operator('OR')->filter('Deletado', 'S')->endClausule()
            ->order_asc('Deletado', 'Email')->find();
        **
        * WHERE Id >= 17 XOR Email REGEXP 'abc|def' AND Data BETWEEN '2001-12-17' AND '2009-10-04' OR Id < 12 LIMIT 4
        * return $this->filter_gte('Id', 17)->operator('XOR')->filter_regexp('Email', 'abc|def')
            ->filter_between('Data', Array('2001-12-17', '2009-10-04'))->operator('OR')->filter_lt('Id', 12)->find(4);
        **
        * WHERE Email = 'abc12' AND Teste > AVG(12, 24, 36, 48) GROUP BY Data HAVING Data > '2003-12-10'
        * return $this->filter('Email', 'abc123')->filter_gt('Teste', Array(12, 24, 36, 48), 'AVG')->group('Data')
            ->having_gt('Data', '2003-12-10')->find();
        ** 
        * Usando métodos mágicos:
        * WHERE Id > 12 AND (Email = 'abc' OR Email = 'def' OR Email = 'ghi' OR Email = 'jklm') ORDER BY Id DESC LIMIT 1;
        * return $this->filter_gt('Id', 12)->any('Email', Array('abc', 'def', 'ghi', 'jklm'))->last();
        *******
        * not: <> | gte: >= | lte: <= | gt: > | lt: < | like: 'xx' | likel: '%xx' | liker: 'xx%' | likelr: '%xx%' | between: xx BETWEEN 'y' AND 'z'
        *******
        * INNER JOIN tabela2 ON (tabela2.id_tabela2 = tabela2.id_tabela1 AND tabela2.coluna1_tabela2 = "" 
            AND tabela2.coluna2_tabela2 LIKE '%teste' XOR tabela2.id2_tabela2 > 1)
        * return $this->join('tabela2', Array(
        *    'eq'       => Array('coluna1_tabela2', ""), // Não habilitado 'flout', essa condição aparece acima
        *    'likel'    => Array('coluna2_tabela2', 'teste'),
        *    'operator' => 'XOR',
        *    'flout.eq' => Array('coluna3_tabela2', NULL), // Note que não tem essa condição na consulta acima ;)
        *    'gt'       => Array('id2_tabela2', 1),
        *  ))->find();
        **
        * LEFT JOIN tabela2 ON (tabela2.id_tabela2 = tabela1.id_tabela1 OR (tabela2.coluna1_tabela2 != 10 
            XOR tabela2.coluna2_tabela2 BETWEEN '2001-12-17' AND '2009-10-04'))
        * return $this->left_join('tabela2', Array(
        *    'operator' => 'OR',
        *    'clausule' => TRUE,
        *    'not'      => Array('coluna1_tabela2', 10),
        *    'operator' => 'XOR',
        *    'between'  => Array('coluna2_tabela2', Array('2001-12-17', '2009-10-04')),
        *    'clausule' => FALSE,
        * ))->find();
        **
        * RIGHT JOIN tabela3 ON (tabela3.coluna1_tabela3 < 2 AND FUNC_HERE('teste', tabela3.coluna2_tabela3, 'abc') 
            OR tabela3.coluna3_tabela3 > AVG(12, 14)) // sem relacionamento principal
        * return $this->right_join('tabela3', Array(
        *     'lt'       => Array('coluna1_tabela3', 2),
        *     'function' => Array('FUNC_HERE', Array('teste', 'coluna2_tabela3', 'abc')),
        *     'operator' => 'OR',
        *     'gt'       => Array('coluna3_tabela3', Array(12, 14), 'AVG'),
        * ), FALSE)->find(); // com false, ele nem se preocupa em buscar o relacionamento
        *******
        */
    }
    
    function validateEmail() {
        return Array(
            'valid'    => 'email',
            'required' => TRUE,
            'min'      => 12,
          //'max' => 40, // máximo 40 caracteres
          //'within' => Array(12, 40), // entre 12 e 40 caracteres
        );
    }
    
    /*
    // 
    function validateConfirmEmail() {
        return Array(
            'equal_field' => 'Email',
        );
    }
    */
    
    function validateNome() {
        return Array(
            'required' => TRUE,
            'within'   => Array(20, 32),
        );
    }
    
    function validateNumber() {
        return Array(
            'list' => Array(2, 4, 6, 8, 11),
          //'regex' => '/d/',
          //'regex_message' => '',
        );
    }
    
    function validateCep() {
        return Array(
            'length' => 8,
            'length_message' => 'Tamanho deve ser igual a 8 números', // sobrescreve a 'resposta' padrão e NÃO utilizará G11n
            'type' => 'integer',
        );
    }
    
    function validateCpf() {
        return Array(
            'callback' => ':validar_cpf', // :xxx -> método desta classe | xxxx:yyy -> class xxxx, método yyy
        );
    }
    
    static function validar_cpf($cpf) {
        return true;
    }
    
    function validateEstado($estado) {
        return Array(
            'equal_str' => 'RS', // Também é possível ;)
        ); 
    }
    
    function usingNome($nome) {
        return 'Sobrescreverá o $nome';
    }
    
    
    /////////////////////////////////////////
    function getSpecific($id) { // $id => array(1,2,3) || '1' || 1
        return $this->findById($id);
    }
    
    function getAllColumn3Is($is, $limit = NULL) {
        /* SELECT Tabela.Id, Tabela.Coluna1, Tabela.Coluna2 
             FROM Tabela
                 INNER JOIN Tabela2 ON (Tabela2.Id_Tabela = Tabela.Id AND Tabela2.coluna1_tabela2 != 10)
            WHERE Tabela.Coluna3 = xxx
              AND Tabela.Coluna1 >= 12
            ORDER BY Tabela.Coluna2 ASC
            LIMIT yyy;
        */
        
        $query = $this->select('Id', 'Coluna1', 'Coluna2');        
        $query->filter('Coluna3', $is)->filter_gte('Coluna1', 12);        
        $query->join('Tabela2', Array(
            'not' => Array('coluna1_tabela2', 10)
        ))->order_asc('Coluna2');        
        $query->find($limit);
        
        return $query;
    }
}